编程基础 - 二进制学习笔记

1. 二进制简介

二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”。当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的。计算机中的二进制则是一个非常微小的开关,用“开”来表示1,“关”来表示0。

2. 二进制表示

对于有n位整数,m位小数的二进制数据用加权系数展开式表示,可写为:

$a{n-1} \times 2^{n-1} + a{n-2} \times 2^{n-2} + \dots + a1 \times 2^1 + a_0 \times 2^0 + a{-1} \times 2^{-1} + a{-2} \times 2^{-2} + \dots + a{-m} \times 2^{-m}$

一般可简化为:$(a{n-1}a{n-2} \dots a1a_0 . a{-1}a{-2} \dots a{-m})_2$

表达式中形如$a_p$的写法表示为第$p$位的系数,它为0和1中的某一个数。

例如将二进制数据101.01写成加权系数的形式:

解:$(101.01)_2 = (1 \times 2^2) + (0 \times 2^1) + (1 \times 2^0) + (0 \times 2^{-1}) + (1 \times 2^{-2})$

可以这样来记,比如101.01整数部分有三位,从右往左从0开始数其指数系数依次就是0,1,2

小数部分有两位,从左往右从-1开始数其指数系数依次是-1,-2,然后用对应的位权系数乘以2的n次幂相加即可

也可以按照公式中读位的方式来记。

补充个小知识,一个数的负次方即为这个数正倒数的正次方。如 $2^{-5} = {\frac{1}{2}}^{5}$

3. 二进制运算

加运算:0+0=0,0+1=1,1+0=1,1+1=10 (逢2进1)

减运算:1-1=0,1-0=1,0-0=0,0-1=1,(向高位借1当2)

乘运算:0×0=0,0×1=0,1×0=0,1×1=1,(只有同时为“1”时结果才为“1”)

除运算:0÷1=0,1÷1=1,0÷0 = 0,1÷0 = 0 (无意义)

逻辑运算:

  • 或运算:遇1得1
  • 与运算:遇0得0
  • 非运算:各位取反

4. 二进制转换

首先了解一个概念,什么是“权”。“权”就是进制的基底的n次幂。如二进制的权就是$2^n$了,十进制的权就是$10^n$。

接下来转换为其他进制:

(a.)二进制转十进制:

按权展开求和既可,简化运算时可以把数位数为0的项不写出来,(因为0乘以其他不为0的数都是0)。小数部分也一样,但精确度较少。

例1:$(1011)2 = (1 \times 2^3) + (0 \times 2^2) + (1 \times 2^1) + (1 \times 2^0) = (11){10}$

例2:$(11.01)_2 = (1 \times 2^1) + (1 \times 2^0) + (0 \times 2^{-1}) + (1 \times 2^{-2}) $

​ $= (2 + 1 + 0 + 0.25)_{10}$

​ $= (3.25)_{10}$

(b.)二进制转十六进制:

二进制数转换成十六进制数时,只要从小数点位置开始,向左或向右每四位二进制划分一组(不足四位数可补0),然后写出每一组二进制数所对应的十六进制数码即可,采用的是“四位一并法”。

例题:将二进制数10110.0011转成对应的十六进制数

首先将二进制数10110.0011写出对应的十六进制数码为0001 0110 . 0011

接下来再看十六进制表示和与二进制数之间的对应关系表:

十进制数表示与十六进制数表示对照表:

0 1 2 3 4 5
0 1 2 3 4 5
6 7 8 9 10 11
6 7 8 9 A B
12 13 14 15
C D E F

十六进制数与二进制数对应关系表:

0 1 2 3 4 5
0000 0001 0010 0011 0100 0101
6 7 8 9 A B
0110 0111 1000 1001 1010 1011
C D E F
1100 1101 1110 1111

对应关系表可以采用8421法来对应转换,可以参考8421码,牢记对应关系,在转换的过程中就会事半功倍。

然后将十六进制数码按取四合一法,即每四位取成一位,就是对应的十六进制数:

0001 0110 . 0011
1 6 . 3

所以例题中的二进制数10110.0011转成十六进制数为0x16.3

注:十六进制的表示法,用字母H后缀表示,也可以用0x前缀表示,比如BH表示16进制11,比如0x23就是16进制的23

关于十六进制的转换,更加直观的理解可以参考这里

(c.)二进制转八进制:

二进制转换为八进制,采用“三位一并法”,就是以小数点为中心向左或向右以每三位划分一组,(不足三位的补0),这样就可以轻松的进行转换。

例题:将二进制数10110.0011转成对应的八进制数

首先将二进制数10110.0011写出对应的八进制数码为010 110 . 001 100

接下来再看八进制表示和与二进制数之间的对应关系表:

0 1 2 3
000 001 010 011
4 5 6 7
100 101 110 111

对应关系表可以采用421法来对应转换,然后将八进制数码按取三合一法,即每三位取成一位,就是对应的八进制数:

010 110 . 001 100
2 6 . 1 4

所以例题中的二进制数10110.0011转成八进制数为26.14

5. 其他进制转换为二进制

(a.)十进制转二进制:

整数转换:采用连续除基取余(短除法),逆序排列法,直至商为0。

小数转换:采用连续乘基(即2)取整,顺序排列法,直至乘积没有小数,一般是乘不尽的,保留相应位数即可。

例题:将十进制数125.11转为二进制数(保留6位小数)

先算整数部分:(除2取余法)

125/2 = 62 ...... 1(余数)
62/2 = 31 ...... 0
31/2 = 15 ...... 1
15/2 = 7 ...... 1
7/2 = 3 ...... 1
3/2 = 1 ...... 1
1/2 = 0 ...... 1 // 直至商为0,逆序排列,由下往上抄写为1111101

再来算小数部分:(乘2取整法)

0.11 × 2 = 0.22 ...... 0 (取整)
0.22 × 2 = 0.44 ...... 0
0.44 × 2 = 0.88 ...... 0
0.88 × 2 = 1.76 ...... 1
0.76 × 2 = 1.52 ...... 1
0.52 × 2 = 1.04 ...... 1
... 一般都是乘不尽的,保留相应的小数位即可,顺序排列,由上往下抄写为000111

所以例题中最后结果为1111101.000111

(b.)十六进制转二进制:

把每一位十六进制数对应转换为一个四位二进制数即可。

例题:将十六进制数5FD6.7转为二进制数

由上面的对应关系表可以得出:

5 F D 6 . 7
0101 1111 1101 0110 . 0111

高位的0可以省去,所以最后结果为101111111010110.0111

(c.)八进制转二进制:

同理,把每一位八进制数对应转换为一个三位二进制数即可。

例题:将八进制数25.5转为二进制数

由上面的对应关系表可以得出:

2 5 . 7
010 101 . 111

高位的0可以省去,所以最后结果为10101.111

6. 其他进制的相互转换

其他进制转换都可以借助转为二进制再间接转换,但也有一些便捷的算法

(a.)十进制转十六进制:

整数转换:采用连续除16取余法,逆序排列法,直至商为0。

小数转换:采用连续乘基(即16)取整,顺序排列法,直至乘积没有小数,一般乘不尽,保留相应位数即可。

例题:将十进制数186.11转为十六进制数(保留6位小数)

先算整数部分:

186/16 = 11 ...... 10(余数)
11/16 = 0 ...... 11 // 直至商为0,逆序排列,由下往上抄写为BA

再算小数部分:

0.11 × 16 = 1.76 ...... 1(取整)
0.76 × 16 = 12.16 ...... C
0.16 × 16 = 2.56 ...... 2
0.56 × 16 = 8.96 ...... 8
0.96 × 16 = 15.36 ...... F
0.36 × 16 = 5.76 ...... 5
... 一般都是乘不尽的,保留相应的小数位即可,顺序排列,由上往下抄写为1C28F5

所以例题中最后结果为BA.1C28F5

(b.)十进制转八进制:

同上面转换原理相同,整数部分使用除8取余法,小数部分使用乘8取整法

例题:将十进制数186.11转为八进制数(保留6位小数)

先算整数部分:

186/8 = 23 ...... 2(余数)
23/8 = 2 ...... 7
2/8 = 0 ...... 2 // 直至商为0,逆序排列,由下往上抄写为272

再算小数部分:

0.11 × 8 = 0.88 ...... 0(取整)
0.88 × 8 = 7.04 ...... 7
0.04 × 8 = 0.32 ...... 0
0.32 × 8 = 2.56 ...... 2
0.56 × 8 = 4.48 ...... 4
0.48 × 8 = 3.84 ...... 3
... 保留相应的小数位顺序排列,由上往下抄写为070243

所以例题中最后结果为272.070243

(c.)十六进制转十进制:

十进制的权就是$10^n$,十六进制的权就是$16^n$,同理按权展开求和即可。

例如将十六进制BBA5 .2转为十进制数:

0xBBA5 .2F $ = 11 \times 16^3 + 11 \times 16^2 + 10 \times 16^1 + 5 \times 16^0 + 2 \times16^{-1}$

​ $=(45056 + 2816 + 160 + 5 + 0.125)_{10}$

​ $= (48037.125)_{10}$

(d.)八进制转十进制:

八进制的权就是$8^n$

例如将八进制75 .2转为十进制数,同理按权展开求和为:

$(75.2)_8 = (7 \times 8^1) + (5 \times 8^0) + (2 \times 8^{-1})$

​ $=(56+5+0.25)_{10}$

​ $=(61.25)_{10} $

7. 相关概念

(a.)机器数

一个数在计算机中的二进制表现形式,叫做这个数的机器数,机器数是带符号的,在计算机用一个数的最高位存放符号,正数位为0,负数为1。

例:+3(10进制) ——— 0000 0011(2进制) 计算机字节长8位

(b.)真值

将带符号的机器数对应的真正数值称为机器数的真值.

例:1000 0011(2) ——— 该数据代表的真值为-3(10)

(c.)原码、反码、补码

原码:一个整数按照绝对值大小转换成的二进制数称为原码

反码:将二进制数按位取反,取得的新二进制数称为原二进制数的反码。

补码:反码加1称为补码

热评文章